#ifndef CAMERA_H
#define CAMERA_H

#include <atomic>
#include <condition_variable>
#include <functional>
#include <memory>
#include <mutex>
#include <opencv2/opencv.hpp>
#include <string>
#include <thread>
#include <vector>

#include <libcamera/libcamera.h>

namespace libcamcv {

class Camera {
public:
  // 帧处理回调函数类型
  using FrameCallback = std::function<void(const cv::Mat &)>;

  // 构造函数和析构函数
  Camera();
  ~Camera();

  // 禁止拷贝构造和赋值
  Camera(const Camera &) = delete;
  Camera &operator=(const Camera &) = delete;

  // 初始化相机
  bool init(int width = 640, int height = 480,
            libcamera::PixelFormat format = libcamera::formats::XRGB8888);

  // 设置帧处理回调
  void setFrameCallback(const FrameCallback &callback);

  // 开始和停止捕获
  bool start();
  void stop();

  // 获取相机信息
  std::string getCameraId() const;
  bool isRunning() const;

private:
  // 相机资源
  std::unique_ptr<libcamera::CameraManager> cameraManager_;
  std::shared_ptr<libcamera::Camera> camera_;
  std::unique_ptr<libcamera::CameraConfiguration> config_;
  libcamera::Stream *stream_;
  std::unique_ptr<libcamera::FrameBufferAllocator> allocator_;

  // 请求和缓冲区管理
  std::vector<std::unique_ptr<libcamera::Request>> requests_;
  std::vector<libcamera::FrameBuffer *> bufferPtrs_;

  // 帧处理
  FrameCallback frameCallback_;
  cv::Mat currentFrame_;
  mutable std::mutex frameMutex_;

  // 线程和同步
  std::atomic<bool> running_;
  std::thread captureThread_;

  // 内部方法
  bool allocateBuffers();
  bool createRequests();
  void captureLoop();
  void processRequest(libcamera::Request *request);
  void cleanup();
};

} // namespace libcamcv

#endif // CAMERA_H